/* 
 * 时钟类.
 * 采用工厂式新建对象方法, 
 * 用var myClock = clock()生成对象, 继承时也用工厂式方法新建对象
 * 再添加字段即可.
 * 自对象生成时就自动计时.
 * 使用时应通过公有变量与公有方法设定:
 * 闹钟开关(默认关闭, 响过后也会关闭), 闹钟时间, 
 * 每秒的方法, 闹铃响时的方法.
 */

function clock(){
    
    /* clock类定义开始 */
	var obj={};

    /* 私有变量 */

    //当前时间字典
    var time = {'hour':-1, 'minute':-1};
    //当前时间字符串
    var timeStr = '';
    //计时器
    var interval = null;
    //每秒计时后的附加方法, 这里是默认值, 使用时用公有方法设置
    var perSecMethod = function(){console.log('Default perSecMethod');};
    //设定的闹铃时间字符串
    var alarmTimeStr = '';
    //闹铃附加方法, 这里是默认值, 使用时用公有方法设置
    var alarmMethod = function(){console.log('Default alarm method');};

    /* 公有变量 */

    //闹钟开关
    obj.alarmSwitch = false;

    /* 公有方法 */

    //获取时间字符串
    obj.getTimeStr = function(){
        console.log('obj.getTimeStr', timeStr);
        return timeStr;
    };

    //从字符串设置闹钟
    obj.setAlarmFromStr = function(s){
        alarmTimeStr = s;
    }

    //从一般时间字典设置闹钟
    obj.setAlarmFromDict = function(d){
        var s = toTimeStr(d);
        obj.setAlarmFromStr(s);
    }

    //设置每秒方法
    obj.setPerSecMethod = function(method){
        perSecMethod = method;
    };

    //设置闹铃响时方法
    obj.setAlarmMethod = function(method){
        alarmMethod = method;
    };
	
	//获取设定的闹钟时间字符串
	obj.getAlarmTimeStr=function(){
		return alarmTimeStr;
	};

    /* 私有方法 */

    //每秒执行的方法
    function perSecond(){
        var myDate = new Date();
        time['hour'] = myDate.getHours();
        time['minute'] = myDate.getMinutes();
        timeStr = checkTime(time['hour']);
        timeStr += ':';
        timeStr += checkTime(time['minute']);
        perSecMethod();
        if(obj.alarmSwitch){
            if(timeStr == alarmTimeStr){
                alarmMethod();
                obj.alarmSwitch = false;
            }
        }
    }

    /* 辅助方法, 应理解为私有的类方法, 与对象本体无关, 也无法继承 */

    //修正时间数字, 补0
    function checkTime(i){
        if(i<10){
            return '0'+i;
        }else{
            return ''+i;
        }
    }

    //从一个有hour与minute键的字典t获取一个时间字符串
    function toTimeStr(t){
        result = '';
        result += _checkTime(t['hour'])+':';
        result += _checkTime(t['minute']);
        return result;
    }

    /* 构造 */

    interval = window.setInterval(perSecond, 1000);

    /* clock类定义结束 */

    return obj;

}

